/*
 * Copyright (c) 2006-2025, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-03-28     RT-Thread    first version
 */

#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "drv_common.h"
#include "cmd.h"

json_buffer Json_Buffer;

/*************************************** 4号RS485——JSON DMA配置 ***************************************/
/**
 * @brief  JSON串口DMA接收
 * @param  none
 * @retval none
 */

void JSON_USART_DMA_RX(void)
{
    dma_init_type dma_init_struct;
    /* 使能时钟 */
    crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
    /* 使能dma复用功能 */
    dmamux_enable(DMA1, TRUE);
    /* 复位指定的 DMA 通道 */
    dma_reset(DMA1_CHANNEL4);
    /* 默认填充配置 */
    dma_default_para_init(&dma_init_struct);
    /* DMA 传输数据量+传输方向 */
    dma_init_struct.buffer_size = Json_DATA_SIZE;
    dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
    /* 外设地址+数据宽度+地址增加模式 */
    dma_init_struct.peripheral_base_addr = (uint32_t)&USART3->dt;
    dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
    dma_init_struct.peripheral_inc_enable = FALSE;
    /* 存储器地址+数据宽度+地址增加模式 */
    dma_init_struct.memory_base_addr = (uint32_t)(&(Json_RX(0)));
    dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
    dma_init_struct.memory_inc_enable = TRUE;
    /* 优先级+循环模式 */
    dma_init_struct.priority = DMA_PRIORITY_VERY_HIGH;
    dma_init_struct.loop_mode_enable = FALSE;
    /* 初始化指定的 DMA 通道 */
    dma_init(DMA1_CHANNEL4, &dma_init_struct);
    /* 初始化dma复用功能 */
    dmamux_init(DMA1MUX_CHANNEL4, DMAMUX_DMAREQ_ID_USART3_RX);
    /* 使能指定通道 */
    dma_channel_enable(DMA1_CHANNEL4, TRUE);
    /* 数据接收区数据清理 */
    JSON_RX_BufClear();
}

/**
 * @brief  JSON串口DMA发送
 * @param  none
 * @retval none
 */
void JSON_USART_DMA_TX(u16 size)
{
    dma_init_type dma_init_struct;
    /* 使能时钟 */
    crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
    /* 使能dma复用功能 */
    dmamux_enable(DMA1, TRUE);
    /* 复位指定的 DMA 通道 */
    dma_reset(DMA1_CHANNEL4);
    /* 默认填充配置 */
    dma_default_para_init(&dma_init_struct);
    /* DMA 传输数据量+传输方向 */
    dma_init_struct.buffer_size = size;
    dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
    /* 存储器地址+数据宽度+地址增加模式 */
    dma_init_struct.memory_base_addr = (uint32_t)(&(Json_TX(0)));
    dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
    dma_init_struct.memory_inc_enable = TRUE;
    /* 外设地址+数据宽度+地址增加模式 */
    dma_init_struct.peripheral_base_addr = (uint32_t)&USART3->dt;
    dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
    dma_init_struct.peripheral_inc_enable = FALSE;
    /* 优先级+循环模式 */
    dma_init_struct.priority = DMA_PRIORITY_VERY_HIGH;
    dma_init_struct.loop_mode_enable = FALSE;
    /* 使能DMA发送完成中断 */
    dma_interrupt_enable(DMA1_CHANNEL4, DMA_FDT_INT, TRUE);
    nvic_irq_enable(DMA1_Channel4_IRQn, 1, 0);
    /* 初始化指定的 DMA 通道 */
    dma_init(DMA1_CHANNEL4, &dma_init_struct);
    /* 初始化dma复用功能 */
    dmamux_init(DMA1MUX_CHANNEL4, DMAMUX_DMAREQ_ID_USART3_TX);
    /* 使能指定通道 */
    dma_channel_enable(DMA1_CHANNEL4, TRUE);
}
/**
 * @brief  4号RS485——JSON初始化
 * @param  none
 * @retval none
 */
void Json_Init(void)
{
    gpio_init_type gpio_init_struct;
    /* 使能时钟 */
    crm_periph_clock_enable(CRM_USART3_PERIPH_CLOCK, TRUE);
    crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);
    /* GPIO配置 */
    gpio_default_para_init(&gpio_init_struct);
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
    gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9;
    gpio_init(GPIOD, &gpio_init_struct);
    /* 复用 */
    gpio_pin_mux_config(GPIOD, GPIO_PINS_SOURCE8, GPIO_MUX_7);
    gpio_pin_mux_config(GPIOD, GPIO_PINS_SOURCE9, GPIO_MUX_7);
    /* 串口参数 */
    usart_reset(USART3);
    usart_init(USART3, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
    usart_transmitter_enable(USART3, TRUE);
    usart_receiver_enable(USART3, TRUE);
    /* 中断配置 */
    nvic_irq_enable(USART3_IRQn, 2, 1);
    usart_interrupt_enable(USART3, USART_IDLE_INT, TRUE);
    /* 使用DMA */
    usart_dma_receiver_enable(USART3, TRUE);
    usart_dma_transmitter_enable(USART3, TRUE);
    /* 使能 */
    usart_enable(USART3, TRUE);
    /* DMA接收 */
    JSON_USART_DMA_RX();
}
/**
 * @brief  JSON串口3中断处理函数
 * @param  none
 * @retval none
 */
static rt_sem_t uart_sem; // 信号量

void USART3_IRQHandler(void)
{
    // 进入中断上下文
    // rt_interrupt_enter();
    if (usart_flag_get(USART3, USART_IDLEF_FLAG) != RESET)
    {
        dma_channel_enable(DMA1_CHANNEL4, FALSE);
        dma_flag_clear(DMA1_FDT4_FLAG);
        // 获取接收总数
        Json_RX_TOTAL = Json_DATA_SIZE - dma_data_number_get(DMA1_CHANNEL4);
        // 发送消息队列
        // xQueueSendFromISR(json_work_Queue, &code, &xHigherPriorityTaskWoken);
        // 切换任务
        // 发送信号量，通知任务进行处理
        rt_sem_release(uart_sem);
        usart_flag_clear(USART3, USART_IDLEF_FLAG);
    }
    // 离开中断上下文
    // rt_interrupt_leave();
}

/**
 * @brief  JSON串口DMA1通道4中断处理函数
 * @param  none
 * @retval none
 */
void DMA1_Channel4_IRQHandler(void)
{

    if (dma_interrupt_flag_get(DMA1_FDT4_FLAG))
    {
        /*清除发送*/
        JSON_TX_BufClear();
        // DMA接收
        JSON_USART_DMA_RX();
        dma_flag_clear(DMA1_FDT4_FLAG);
    }
}

u8 MASTER_MODBUS_06_CODE(u8 *const tx_buffer)
{
    u8 len = 0;
    tx_buffer[len++] = 'a'; // 地址
    tx_buffer[len++] = 'a'; // 功能
    tx_buffer[len++] = 'a'; // 地址
    tx_buffer[len++] = 'a'; // 功能
    tx_buffer[len++] = 'a'; // 地址
    tx_buffer[len++] = 'a'; // 功能
    tx_buffer[len++] = 'a'; // 地址
    tx_buffer[len++] = 'a'; // 功能
    tx_buffer[len++] = 'a'; // 地址
    tx_buffer[len] = 'a';   // 功能

    return len;
}

// 任务函数，等待信号量并处理接收到的数据
void uart_receive_task(void *parameter)
{
    rt_err_t result;
    // uint8_t received_data;

    while (1)
    {
        // 等待信号量，直到有数据接收
        result = rt_sem_take(uart_sem, RT_WAITING_FOREVER);
        if (result != RT_EOK)
        {
            rt_kprintf("Failed to take semaphore\n");
            continue;
        }
        rt_kprintf("food_RX_FUNCTION:");
        for (int i = 0; i <= Json_RX_TOTAL - 1; i++)
        {
            rt_kprintf("i:%d:%x\t", i, Json_Buffer.rx_data[i]);
        }
        rt_kprintf("\n");

        rt_kprintf("继电器tx:\r\n");
        int tx_total = MASTER_MODBUS_06_CODE(&(Json_TX(0)));
        JSON_USART_DMA_TX(tx_total);
        // 获取接收到的数据
        //         received_data = (uint32_t)(&(Json_RX(0)));
        //         // 在此进行数据处理
        //         rt_kprintf("Received data: %c\n", received_data);
    }
}

int main(void)
{

    Json_Init();
    // 初始化信号量
    uart_sem = rt_sem_create("uart_sem", 0, RT_IPC_FLAG_FIFO);
    if (uart_sem == RT_NULL)
    {
        rt_kprintf("Failed to create semaphore\n");
        return -1;
    }
    // 创建接收任务
    rt_thread_t tid = rt_thread_create("uart_recv_task", uart_receive_task, RT_NULL, 1024, 10, 20);
    if (tid != RT_NULL)
    {
        rt_thread_startup(tid);
    }
    else
    {
        rt_kprintf("Failed to create UART receive task\n");
    }

    return 0;
}
